const fs    = require('fs')
const path  = require('path')
const argv  = require('optimist').argv;
const config  = require('./config')

const methods = {

    generate (type,appId,projectName,conf){
        // 设置默认参数
        appId && appId.constructor === String ? appId : config[type].appId
        projectName && projectName.constructor === String ? projectName : config[type].projectName

        const projectConf = JSON.parse(fs.readFileSync(path.join(__dirname,`./${type}/project.config.json`)))
        
        projectConf.appid = appId ? appId : ''
        projectConf.projectname = projectName ? projectName : ''
        
        declone(conf,projectConf)
        
        let _path = type === 'weapp' ? `${projectName}` : `${projectName}/dist`
        // console.log('路径：',_path)
        // 生成文件实际路径
        let dir = path.join(config.root,_path,'project.config.json')

        // 不存在文件夹就创建
        if(!fs.existsSync(path.dirname(_path))){
            mkdirsSync(path.join(config.root,_path))
        }

        fs.writeFileSync(dir,JSON.stringify(projectConf,null,2))
    }
}

// 递归创建文件夹
function mkdirsSync(dirname) {  
    if (fs.existsSync(dirname)) {  
        return true;  
    } else {
        if (mkdirsSync(path.dirname(dirname))) {  
            fs.mkdirSync(dirname);  
            return true;  
        }  
    }  
}

// 克隆
function declone(res,parent){
    for (const v in res) {
        // if (parent.hasOwnProperty(v)) {
            if(res[v].constructor === Object || res[v].constructor === Array){
                // 递归下去查找类型为Object和Array的值继续做下层处理
                // 此处加入容错处理在当前层级如果没有当前key存在则生成一个空对象
                parent[v] ? '' : parent[v] = {}
                declone(res[v],parent[v])
                return
            }
            // 在不为Object和Array时结束查询并且赋值
            parent[v] = res[v]
        // }
    }
}

methods.generate(argv.type,argv.appId,argv.projectName,argv.conf)